import com.sun.xml.internal.bind.v2.runtime.property.StructureLoaderBuilder;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Request {      // 这里设计的是请求类
    //  每个字段是一个属性 ，  需要完成的主要任务是 ：按照约定解析请求封装，并将发送的请求封装


    // 提供5中不同类型的操作， 用type字段表示要进行哪种操作
    private Integer type;
    private String url;
    private String data;

    // 服务端解析请求时： 根据约定好的格式来解析 这个方法的作用就是解析请求报文
    public static Request serverParse(InputStream is) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        Request request = new Request();

        // 前2 行分别为 操作类型和操作路径
        request.type = Integer.parseInt(br.readLine());
        request.url = br.readLine();
        // 使用list保存字符
        List<Character> list = new ArrayList<>();
        // 数据 ： 循环读取
        while(true){
            // 一个字符一个字符的读
            char c = (char) br.read();
            // 读到约定的 结束符就结束 \3
            if(c == '\3')
                break;
            list.add(c);
        }
        System.out.println(request.type);
        System.out.println(request.url);
        System.out.println(list);
//        System.out.println(Arrays.toString(list));
        // 拼接数据
        StringBuilder sb = new StringBuilder();
        for (char c : list){
            sb.append(c);
        }
        request.data = sb.toString();
        return request;
    }

    // 客户端发送信息到服务器     感觉这个函数的作用有点奇怪
    public void clientWrite(OutputStream os) throws IOException{
        PrintWriter pw = new PrintWriter(os);
        pw.println(type);
        pw.println(url);
//        pw.println(data + "\3");
        pw.write(data + "\3");
        //System.out.println("Request中的data："+data);
        // TCP 有缓冲区的IO ， 及时刷新缓冲区
        pw.flush();
    }

    public String toString(){
        return "Request{"+
                "type="+type+
                ", url='"+ url + '\''+
                ", data ='"+data +'\''+
                '}';
    }

    public Integer getType(){
        return type;
    }
    public void setType(Integer type){
        this.type = type;
    }
    public String getUrl(){return url;}
    public void setUrl(String url){this.url = url;}
    public String getData(){return data;}
    public void setData(String data){this.data = data;}

}
